package com.novunda.tool.qrcode;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 * @author linfeng
 * @since 2016/11/10
 */
public class QRCodeUtils {

    /**
     * 编码字符串内容到目标File对象中
     *
     * @param encodeddata 编码的内容
     * @param destFile    生成file文件  1381090722   5029067275903
     * @throws IOException
     */
    public static void qrCodeEncode(String encodeddata, File destFile) throws IOException {
        QRCode qrcode = new QRCode(-1, QRErrorCorrectLevel.L);
        qrcode.addData(encodeddata);
        qrcode.make();

        int width = qrcode.getModuleCount() * 10;
        int height = qrcode.getModuleCount() * 10;

        int tileW = width / qrcode.getModuleCount();
        int tileH = height / qrcode.getModuleCount();

        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // createGraphics   // 创建图层
        Graphics2D graphics = bi.createGraphics();

        graphics.setBackground(Color.WHITE);   // 设置背景颜色（白色）
        graphics.clearRect(0, 0, width, height);    // 矩形 X、Y、width、height
//        graphics.setColor(Color.WHITE);    // 设置图像颜色（黑色）

        for (int row = 0; row < qrcode.getModuleCount(); row++) {
            for (int col = 0; col < qrcode.getModuleCount(); col++) {
                graphics.setColor(qrcode.isDark(row, col) ? Color.RED : Color.BLUE);
                int w = Double.valueOf(Math.ceil((col + 1) * tileW) - Math.floor(col * tileW)).intValue();
                int h = Double.valueOf(Math.ceil((row + 1) * tileW) - Math.floor(row * tileW)).intValue();
                graphics.fillRect(Math.round(col * tileW), Math.round(row * tileH), w, h);
            }
        }

        graphics.dispose(); // 释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后，就不能再使用 Graphics 对象
        bi.flush(); // 刷新此 Image 对象正在使用的所有可重构的资源

        ImageIO.write(bi, "png", destFile);
        System.out.println("Input Encoded data is：" + encodeddata);
    }

    public static void main(String[] args) {
        File distFile = new File("d:/img.png");
        try {
            QRCodeUtils.qrCodeEncode("测试操作十大大s倒萨的额度撒反对阿斯蒂芬阿斯蒂芬啊实打实的爱上大s的阿萨德爱上的", distFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
